using System;
using System.Collections.Generic;
using System.Globalization;
using System.Xml;
using Boyum.Utilities.FileHandler.Model;
using SAPbobsCOM;
using SBO.DI;

namespace UFFITemplate
{
	public class UffiRunner : UniversalFunctions.Public.FileImporter.IImporter
	{
		public FileHandlerResultEntry Import(FileHandlerParameters parameters)
		{
			try
			{
				string fileName = parameters.File;
				var objectToImportFromXml = CreateObjectToImportFromXml(parameters);
				var document = B1BusinessObjects.Documents.Drafts.TemplateObject;
				document.DocObjectCode = BoObjectTypes.oPurchaseInvoices;
				document.DocType = BoDocumentTypes.dDocument_Items; 
				document.CardCode = objectToImportFromXml.CardCode;
				document.DocDueDate = objectToImportFromXml.InvoiceDate;
				document.DocDate = objectToImportFromXml.InvoiceDate;
				var documentLines = document.Lines;
				bool first = true;
				foreach (var line in objectToImportFromXml.Lines)
				{
					if (first)
					{
						first = false;
					}
					else
					{
						documentLines.Add();
					}
					documentLines.ItemCode = line.ItemCode;
					documentLines.Quantity = line.Quantity;
				}
				if(document.Add() != 0)
				{
					return new FileHandlerResultEntry(FileHandlerResultStatus.Error, GetLastError.ErrorNumberAndDescription + " CardCode: " + objectToImportFromXml.CardCode);
				}
				return new FileHandlerResultEntry(FileHandlerResultStatus.Success);
			}
			catch (Exception e)
			{
				return new FileHandlerResultEntry(FileHandlerResultStatus.Error, "Exception caught", e);
			}
		}

		private ObjectToImport CreateObjectToImportFromXml(FileHandlerParameters parameters)
		{
			var xmlDoc = new XmlDocument();
			xmlDoc.Load(parameters.File);
			var order = new ObjectToImport();
			order.CardCode = xmlDoc.GetElementsByTagName("CardCode")[0].InnerText;
			order.InvoiceDate = DateTime.Today;
			XmlNodeList items = xmlDoc.GetElementsByTagName("Item");
			foreach (XmlNode item in items)
			{
				var lines = new Line();
				foreach (XmlNode attributes in item.ChildNodes)
				{
					switch (attributes.Name)
					{
						case "ItemCode":
							lines.ItemCode = attributes.InnerText;
							break;
						case "Quantity":
							lines.Quantity = Convert.ToInt32(attributes.InnerText);
							break;
					}					
				}
				order.Lines.Add(lines);
			}
			return order;
		}

		private class ObjectToImport
		{
			public DateTime InvoiceDate { get; set; }
			public string CardCode { get; set; }
			public List<Line> Lines { get; private set; }
			public ObjectToImport()
			{
				Lines = new List<Line>();
			}
		}

		private class Line
		{
			public string ItemCode { get; set; }
			public double Quantity { get; set; }
		}
	}
}
